/*
Language: PHP
Author: Victor Karamzin <Victor.Karamzin@enterra-inc.com>
Contributors: Evgeny Stepanischev <imbolk@gmail.com>, Ivan Sagalaev <maniac@softwaremaniacs.org>
*/

function(hljs) {
  var VARIABLE = {
    className: 'variable', begin: '\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
  };
  var STRINGS = [
    hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null}),
    hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),
    {
      className: 'string',
      begin: 'b"', end: '"',
      contains: [hljs.BACKSLASH_ESCAPE]
    },
    {
      className: 'string',
      begin: 'b\'', end: '\'',
      contains: [hljs.BACKSLASH_ESCAPE]
    }
  ];
  var NUMBERS = [
    hljs.C_NUMBER_MODE, // 0x..., 0..., decimal, float
    hljs.BINARY_NUMBER_MODE // 0b...
  ];
  var TITLE = {
    className: 'title', begin: hljs.UNDERSCORE_IDENT_RE
  };
  return {
    case_insensitive: true,
    defaultMode: {
      keywords:
        'and include_once list abstract global private echo interface as static endswitch ' +
        'array null if endwhile or const for endforeach self var while isset public ' +
        'protected exit foreach throw elseif include __FILE__ empty require_once do xor ' +
        'return implements parent clone use __CLASS__ __LINE__ else break print eval new ' +
        'catch __METHOD__ case exception php_user_filter default die require __FUNCTION__ ' +
        'enddeclare final try this switch continue endfor endif declare unset true false ' +
        'namespace trait goto instanceof insteadof __DIR__ __NAMESPACE__ __halt_compiler',
      contains: [
        hljs.C_LINE_COMMENT_MODE,
        hljs.HASH_COMMENT_MODE,
        {
          className: 'comment',
          begin: '/\\*', end: '\\*/',
          contains: [{
              className: 'phpdoc',
              begin: '\\s@[A-Za-z]+'
          }]
        },
        {
            className: 'comment',
            excludeBegin: true,
            begin: '__halt_compiler.+?;', endsWithParent: true
        },
        {
          className: 'string',
          begin: '<<<[\'"]?\\w+[\'"]?$', end: '^\\w+;',
          contains: [hljs.BACKSLASH_ESCAPE]
        },
        {
          className: 'preprocessor',
          begin: '<\\?php',
          relevance: 10
        },
        {
          className: 'preprocessor',
          begin: '\\?>'
        },
        VARIABLE,
        {
          className: 'function',
          beginWithKeyword: true, end: '{',
          keywords: 'function',
          illegal: '\\$|\\[|%',
          contains: [
            TITLE,
            {
              className: 'params',
              begin: '\\(', end: '\\)',
              contains: [
                'self',
                VARIABLE,
                hljs.C_BLOCK_COMMENT_MODE
              ].concat(STRINGS).concat(NUMBERS)
            }
          ]
        },
        {
          className: 'class',
          beginWithKeyword: true, end: '{',
          keywords: 'class',
          illegal: '[:\\(\\$]',
          contains: [
            {
              beginWithKeyword: true, endsWithParent: true,
              keywords: 'extends',
              contains: [TITLE]
            },
            TITLE
          ]
        },
        {
          begin: '=>' // No markup, just a relevance booster
        }
      ].concat(STRINGS).concat(NUMBERS)
    }
  };
}
